package com.link.base.base.user.service;

import com.alibaba.fastjson.JSONObject;
import com.link.base.base.accnt.model.Account;
import com.link.base.base.auth.model.Authclient;
import com.link.base.base.enterprise.model.Enterprise;
import com.link.base.base.mpconfig.model.Mp;
import com.link.base.base.user.model.JWT;
import com.link.base.base.user.model.RespDTO;
import com.link.base.base.user.model.User;
import com.link.base.user.model.CoreUser;
import com.link.core.basic.query.QueryParams;
import com.link.core.basic.service.BasicService;
import com.link.core.basic.service.BasicServiceException;
import com.link.core.util.redisclient.LinkRedisClient;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author unknown
 * @date unknown
 * @comments 用户数据服务
 */
public interface UserService extends BasicService<User> {

    /**
     * 设置密码
     *
     * @param user
     * @param oldPassword     旧密码
     * @param newPassword     新密码
     * @param confirmPassword 密码确认
     * @return string
     * @throws BasicServiceException
     */
    public String modifyPassword(CoreUser user, String oldPassword,
                                 String newPassword, String confirmPassword) throws BasicServiceException;

    /**
     * 获取小程序配置信息
     *
     * @author LiQun
     * @date 2019/3/28 11:36
     * @param appEncryptionId 小程序加密id
     * @param jedis jedis实例
     */
    public Mp getMpConfigInfo(LinkRedisClient  jedis, String appEncryptionId) throws Exception;

    /**
     * 通过code获取sessionkey,unionid,openid等信息
     *
     * @author LiQun
     * @date 2019/3/28 11:33
     * @param code 票据
     * @param mpAppId 小程序appid
     * @param mpAppSecret 小程序秘钥
     */
    public JSONObject getJsCodeToSession(String code, String mpAppId, String mpAppSecret) throws Exception;

    /**
     * 通过code获取sessionkey,userid,corpid等信息
     *
     * @author LiQun
     * @date 2019/3/28 11:33
     * @param code 票据
     * @param accessToken
     */
    JSONObject codeToSessionOfCorpWx(String code,String accessToken) throws Exception;

    /**
     * 重置密码
     *
     * @param user
     * @param newPassword 新密码
     * @param confirmPassword 密码确认
     * @return string
     * @throws BasicServiceException
     */
    public String resetPassword(User user, String newPassword, String confirmPassword) throws BasicServiceException;

    /**
     * 设置员工密码
     *
     * @param id
     * @param newPassword
     * @param confirmPassword
     * @return string
     * @throws BasicServiceException
     */
    public String modifyEmpLoyeePassword(Long id, String newPassword, String confirmPassword) throws BasicServiceException;

    /**
     * 根据用户名查找用户
     *
     * @param username 用户名
     * @return 用户信息
     * @throws BasicServiceException
     */
    public User getUserByUsername(String username) throws BasicServiceException;

    /**
     * <p>根据id查询用户基本信息，工号、用户名等</p>
     *
     * @author yrf
     * @param record
     * @return 用户信息
     * @throws Exception
     *
     */
    public User querySampleUserById(User record) throws Exception;

    /**
     * 更新DMS个人信息
     *
     * @param record
     * @throws Exception
     */
    public void updateDmsProfile(User record) throws Exception;

    /**
     * <p>外部用户新建默认值</p>
     *
     * @return 用户信息
     * @throws Exception
     */
    public User outerPreDefaultValue() throws Exception;


    /**
     * 修改主要职位
     *
     * @param userId  用户ID
     * @param postnId 职位ID
     * @throws Exception
     */
    public void mainPostnUpdate(Long userId, Long postnId) throws Exception;

    /**
     * 修改员工密码
     *
     * @param record
     * @throws Exception
     */
    public void updatePassword(User record) throws Exception;

    /**
     * 复制用户mvg信息（职位，职责）
     *
     * @param user
     * @param qps
     * @throws Exception
     */
    public void copyUserMvgInfo(User user, QueryParams qps) throws Exception;

    /**
     * <p>查询当前账套下基本用户信息</p>
     *
     * @author yrf
     * @param record
     * @return 用户信息列表
     * @throws Exception
     *
     */
    public List<User> queryCorpSampleUser(User record) throws Exception;

    /**
     * 根据用户Id查找用户
     *
     * @param user
     * @return 用户信息
     * @throws Exception
     */
    public User getUserByUserId(User user) throws Exception;

    /**
     * crm登录
     *
     * @author huanglongjian
     * @date 2019-08-06 18:35
     * @param username 用户名
     * @param password 密码
     * @param loginType 登录类型
     * @param request 请求参数
     * @param language
     * @return com.link.business.base.user.model.RespDTO
     */
    public RespDTO login(String username, String password, String loginType, HttpServletRequest request, String language) throws Exception;

    /**
     * 设置登录信息
     *
     * @param token
     * @param user
     * @param refreshToken
     * @param expires
     * @param scope
     * @return RespDTO
     * @throws Exception
     */
    public void setLoginInfo(String token, User user, String refreshToken, int expires, String scope, Enterprise enterprise) throws Exception;

    /**以下方法为app新增*/

    /**
     * app用
     * 根据用户名查询用户信息
     *
     * @param username
     * @return 用户
     */
    public User queryByUserName(String username);

    /**
     * 生成用户登录Token
     *
     * @param login
     * @param corpId
     * @param UUID
     * @param passwd
     * @return loginToken
     * @throws Exception
     */
    public String mobileGetLoginToken(String login, Long corpId, String UUID, String passwd, String scope) throws Exception;

    /**
     * 校验用户登录Token合法性
     *
     * @param login
     * @param corpId
     * @param UUID
     * @param loginToken
     * @return loginToken
     * @throws Exception
     */
    public String verifyLoginToken(String login, Long corpId, String UUID, String loginToken) throws Exception;


    /**
     * 给当前登录用户绑定一个token，报表专用
     *
     * @param user
     * @param accessToken
     * @throws Exception
     */
    public void bindingUserAndToken(User user, String accessToken,int expire) throws Exception;

    /**
     * 绑定微信/QQ 用的unionId 到用户表
     *
     * @param record
     * @throws Exception
     */
    public void thirdClientBindUser(User record) throws Exception;

    /**
     * 解除绑定用户
     *
     * @param user
     * @throws Exception
     */
    void unBoundAccount(User user) throws Exception;

    /**
     * 获取当前用户绑定的列表
     *
     * @param user
     * @return 用户
     * @throws Exception
     */
    public User getBoundAccounts(User user) throws Exception;

    /**
     * 更新用户信息
     * @author ouyangzhenqiang
     * @param record
     * @throws Exception
     * @date 2018/11/1
     */
    void updateUserInfo(User record) throws Exception;

    /**
     * 确认登录错误次数
     * @author ouyangzhenqiang
     * @param username
     * @throws Exception
     * @date 2018/11/1
     */
    public void checkLoginErrorTimes(String username) throws Exception;

    /**
     * 重置redis中的sessionkey的值
     *
     * @author LiQun
     * @param code            票据
     * @param appEncryptionId app加密id
     * @param session_key     自定义的key
     * @date 2019/3/28 14:44
     */
    public JSONObject resetSessionKey(String code, String appEncryptionId, String session_key) throws Exception;

    /**
     * 小程序用户登录
     *
     * @param user 小程序用户信息
     * @return RespDTO
     * @throws Exception
     */
    public RespDTO mpLogin(User user) throws Exception;

    /**
     * 获取token
     *
     * @param login    用户名
     * @param passwd   密码
     * @param type     类型 如果是小程序 则为 'mp'
     * @param mpOpenId 小程序openid
     * @param mpCorpId 小程序corpId
     * @return JWT
     * @throws Exception
     */
    public JWT getAccessToken(String login, String passwd, String type, String mpOpenId, String mpCorpId, String scope) throws Exception;

    /**
     * 账号初始化密码
     *
     * @param user
     * @throws Exception
     */
    public void genPsw(User user) throws Exception;

    /**
     * 设置某用户名的登录错误次数
     *
     * @param username   用户名
     * @param errorTimes 要设置的密码错误次数
     * @throws Exception
     */
    public void setLoginErrorTimes(String username, int errorTimes) throws Exception;

    /***
     * 获取登录失败次数
     *
     * @param username  用户名
     * @return int
     * @throws Exception
     */
    public int getLoginErrorTimes(String username) throws Exception;


    /**
     * 更新用户状态
     *
     * @param record
     * @throws Exception
     */
    public void userStatusUpdate(User record) throws Exception;

    /**
     * 根据corpid 查询User
     * @author  wangdawei
     * @param corpId
     * @return
     * @throws Exception
     */
    public User queryUserByCropId(Long corpId) throws Exception;

    public User queryEnterpriseAdminByName(User user) throws Exception;

    /**
     * 根据传入的ORGID获取他及他下级组织的所有用户
     * @author 黄正杨
     * @date 2019/4/23
     * @param user
     * @return List
     * @throws Exception
     */
    List<User> selectByOrgIdPage(User user)throws Exception;

    /***
     * DESC: 根据用户名查询用户记录
     *
     * @param
     * @author: xubowen
     * @return: com.link.business.base.user.model.User
     * @date: 2019-05-05
     */
    User queryByLogin(User user)throws Exception;

    /**
     * @author HuangLJ
     * @date 2019-07-19 10:41
     * 通过返回，或者clientid获得客户端信息
     */
    Authclient getAuthclient(String scope, String clientId) throws Exception;


    /**
     * @author HuangLJ
     * @date 2019-07-19 10:43
     * 生成到认证服务器认证的字符串
     */
    String genAuthHeader(Authclient authlient) throws Exception;

    /**
     * api登录
     *
     * @author huanglongjian
     * @date 2019-08-06 18:35
     * @param clientId 用户名
     * @param password 密码
     * @param request 请求参数
     * @return com.link.business.base.user.model.RespDTO
     */
    public RespDTO apiLogin(String clientId, String password, String username, HttpServletRequest request) throws Exception;

    /**
     * pc端
     *
     * @author huanglongjian
     * @date 2019-08-06 18:35
     * @param usernameArg 用户名
     * @param password 密码
     * @param loginType 登录类型
     * @param request 请求参数
     * @return com.link.business.base.user.model.RespDTO
     */
    public RespDTO thirdPCLogin(String usernameArg, String password, String loginType, HttpServletRequest request) throws Exception;

    /**
     * 将DMP数据转化为link的对象
     * @author 曾迟
     * @date 2019-12-17 20:18:48
     * @param jsonObj 消费者json数据
     * @return
     **/
    public Account transformDmpToLink(JSONObject jsonObj);

    /**
     * 将link中的Account对象做字段映射，提供调用DMP接口的消费者参数
     * @author 曾迟
     * @date 2019-12-17 20:19:13
     * @param entity 消费者
     * @return
     **/
    public Object transformToDmpConsumer(Account entity);

    /**
     * 企业微信小程序用户登录
     *
     * @param user 小程序用户信息
     * @return RespDTO
     * @throws Exception
     */
    RespDTO corpWxMpLogin(User user) throws Exception;

    /**
     * 根据来源查询用户
     *
     * @author 刘启鑫
     * @date 2020/9/9 22:01
     * @param source
     */
    List<User> queryUsersBySource(User source);

    RespDTO dingdingLogin(String authCode, String crmLogin, HttpServletRequest request) throws Exception;
}
